package cn.demoncat.util.web.cloud.util;

import org.apache.commons.lang3.StringUtils;

import cn.demoncat.util.web.cloud.annotation.ManualFeignClient;
import feign.Client;
import feign.Contract;
import feign.Feign;
import feign.codec.Decoder;
import feign.codec.Encoder;

/**
 * Spring Cloud Feign 工具
 * 
 * @author 延晓磊
 *
 * @since 2020年1月30日
 */
public class FeignUtil {

	/**
	 * 手动创建Feign接口
	 * 
	 * @param decoder		Feign配置
	 * @param encoder
	 * @param client
	 * @param contract
	 * @param feignClient	FeignClient接口，注解ManualFeignClient
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2020年1月30日
	 */
	public static <T>T build(Decoder decoder, Encoder encoder, Client client, Contract contract, Class<T> feignClient) {
		// 获取注解
		ManualFeignClient annotation = feignClient.getAnnotation(ManualFeignClient.class);
		if (annotation == null) {
			throw new RuntimeException("FeignClient接口必须注解ManualFeignClient");
		}
		// 目标服务
		String url = annotation.name();
		if (StringUtils.isBlank(url)) {
			url = annotation.value();
			if (StringUtils.isBlank(url)) {
				throw new RuntimeException("FeignClient接口必须注解ManualFeignClient并指定URL");
			}
		}
		url = url + annotation.path();
		// 创建FeignClient
		return build(decoder, encoder, client, contract, feignClient, url);
	}
	
	/**
	 * 手动创建Feign接口
	 * 
	 * @param decoder		Feign配置
	 * @param encoder
	 * @param client
	 * @param contract
	 * @param feignClient	FeignClient接口
	 * @param url			目标URL（服务名/公共前缀），如 demoncat-core-web、demoncat-core-web/rest/user
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2020年1月30日
	 */
	public static <T>T build(Decoder decoder, Encoder encoder, Client client, Contract contract, Class<T> feignClient, String url) {
		return Feign.builder().client(client).encoder(encoder).decoder(decoder).contract(contract).target(feignClient, "http://"+url);
	}
 
}
